#ifndef _HANDSHAKETASKQUEUE_H
#define _HANDSHAKETASKQUEUE_H

#include <any>
#include <condition_variable>
#include <cstddef>
#include <functional>
#include <iostream>
#include <memory>
#include <mutex>
#include <queue>
#include <stdio.h>
#include <stdlib.h>
#include <thread>
namespace droneswarm
{
    // 本类和线程类遵循生产者消费者模型，服务器类充当这个线程池的管理类，就是接口类，其它类不会使用到这个线程池
    // 当连接出现时，服务器线程会将认证任务添加到任务队列中，因此我们需要相关的改进。
    // 首先当连接发生时，我就会创建任务，将任务放进任务队列中。
    // 服务启动时，也会启动4个线程来从任务队列中取任务，去执行，如果任务队列为空，这4个线程全部阻塞，如果有任务，取到的线程去执行，没取到的继续阻塞
    //  using callback = std::function< void( std::any ) >;
    // 任务定义
    struct HandshakeTask
    {
        HandshakeTask()
            : function( nullptr )
            , arg( nullptr )
        {
        }
        HandshakeTask( std::function< void( std::any ) > f, std::any arg )
            : function( f )
            , arg( arg )
        {
        }

        std::function< void( std::any ) > function;
        std::any arg;
    };

    // 定义任务队列
    class HandshakeTaskQueue
    {
    public:
        HandshakeTaskQueue();
        ~HandshakeTaskQueue();

        void addTask( HandshakeTask &task );
        void addTask( std::function< void( std::any ) > func, std::any arg );

        //
        HandshakeTask takeTask();

        // 获取当前队列中的任务个数
        inline int taskNumber() { return TaskQueue_.size(); }

    private:
        std::mutex mutex_;                       // 定义互斥锁
        std::queue< HandshakeTask > TaskQueue_;  // 定义任务队列
    };
}  // namespace droneswarm

#endif
